# 2.3 运算符
## 运算符分类
运算符分为算术运算符、逻辑运算符、关系运算符、移位运算符等。
| 类型 | 符号 | 功能说明 | 类型 | 符号 | 功能说明 |
|------|------|----------|------|------|----------|
| 算术运算符 | +
-
-
*
/ | 二进制加
二进制减
2的补码
二进制乘
二进制除 | 关系运算符
(双目运算符) | >
<
>=
<=
==
!= | 大于
小于
大于或等于
小于或等于
相等
不相等 |
| 位运算符
(双目运算符) | ~
&
\|
^
^~或~^ | 按位取反
按位与
按位或
按位异或
按位同或 | 缩位运算符
(单目运算符) | &
~&
\|
~\|
^
^~或~^ | 缩位与
缩位与非
缩位或
缩位或非
缩位异或
缩位同或 |
| 逻辑运算符
(双目运算符) | !
&&
\|\| | 逻辑非
逻辑与
逻辑或 | 移位运算符
(双目运算符) | >>
<< | 右移
左移 |
| 位拼接运算符 | {,}
{{}} | 将多个操作数
拼接成为
一个操作数 | 条件运算符
(三目运算符) | ?: | 根据条件表达式
是否成立,
选择表达式 |
## 四值逻辑真伪判断
1. 在逻辑运算符中,如果操作数是1位的,则用"1"表示逻辑真状态,用"0"表示逻辑假状态;
2. 若操作数由多位组成,必须把操作数当做整体来处理,即如操作数所有位都是0,那么该操作数整体看做逻辑0,反之,只要其中一位为1,那么该操作数整体看做逻辑1;
3. 如果任意一个操作数包含x,逻辑运算结果也为x。
```verilog
!x // 结果为x
4'b1010 && 4'b1111 // 结果是1
4'b0000 && 4'b1001 // 结果是0
```
## 四值逻辑算术运算
1. 整数除法将截断所有小数部分,只取整数部分。如7/4结果为1;
2. 模运算符将求出与第一个操作数符号相同的余数;
```verilog
7%4 // 结果为3
-7%4 // 结果为-3
```
3. 如果算术运算符的操作数中出现x或z,那么整个算术运算符的运算结果为x。
```verilog
4'b10x1 + 4'b0111 // 结果为不确定数 4'bxxxx
```
4. 进行算术运算时,操作数的长度可能不一致,这时运算结果的长度由最长的操作数决定。但在赋值语句中,运算结果的长度由赋值目标长度决定。
## 四值逻辑关系运算
**如果操作数的长度不同,那么长度短的操作数在高位添0补齐**,如果操作数被比较位中出现x或z,那么结果为x。
```verilog
4'b10x1 < 4'b1101 // 结果为x
```
## 四值逻辑比较
1. `==`和`!=` 是把两个操作数的逻辑值做比较,由于操作数中某些位可能是x或z,所以比较结果也有可能是x。
2. `===`和`!==`运算符是按位进行比较,即便在两个操作数中某些位出现了x或z,只要它们出现在相同的位,那么就认为两者是相同的,比较结果为1,反之为0,而不会出现结果为x的情况。其常用于case表达式的判别,所以又称为"case等式运算符"。
```verilog
a = 4'b0010;
b = 4'bx10;
c = 4'bx101;
d = 4'bx10;
a === b // 结果为假,值为0,严格按位比较
a != d // 结果为x
b == d // 结果为x,因为操作数出现了x
b !== d // 结果为0
b === d // 结果为真,值为1,严格按位比较
```
## 位拼接运算符
1. 作用是将两个或多个信号的某些位拼接起来成为一个新的操作数,进行运算操作
```verilog
// 设A=1'b1, B=2'b10, C=2'b00,则:
{B,C} // 结果为4'b1000
{A,B[1],C[0]} // 结果为3'b110
{A,B,C,3'b101} // 结果为8'b11000101
```
2. 对同一个操作数的重复拼接还可以用双重大括号构成的运算符{{ }}
```verilog
{4{A}} // 结果为4'b1111
{2{A},2{B},C} // 结果为8'b11101000
```
## 位运算符与缩位运算符的比较
假设:A=4'b1010,B=4'b1111
| 运算类型 | ~(取反) | &(与) | \|(或) | ^(异或) | ~^(同或) |
|----------|---------|-------|--------|---------|----------|
| 位运算 | ~A=4'b0101
~B=4'b0000 | A&B=4'b1010 | A\|B=4'b1111 | A^B=4'b0101 | A~^B=4'b1010 |
| 缩位运算 | &A=1&0&1&0=0 | ~&A=1
&B=1 | \|A=1
~\|B=0 | ^A=0
^B=0 | ~^A=1
~^B=1 |
## 条件运算符
三目运算符,运算时根据条件表达式的值选择表达式。一般用法:
```verilog
condition_expr ? expr1 : expr2;
```
首先计算第一个操作数`condition_expr`的值,如果结果为逻辑1,则选择第二个操作数`expr1`的值作为结果返回;若结果为逻辑0,选择第三个操作数`expr2`的值作为结果返回。
## 运算符的优先级
| 类型 | 符号 | 优先级 |
|------|------|--------|
| 取反 | ! ~ -(求2的补码) | 最高 |
| 算术 | * /
+ - | |
| 移位 | >> << | |
| 关系 | < <= > >= | |
| 等于 | == != | |
| 缩位 | & ~&
^ ^~
\| ~\| | |
| 逻辑 | &&
\|\| | |
| 条件 | ?: | 最低 |